<?php
/**
 * Created by PhpStorm.
 * User: Eric-pc3
 * Date: 2018/8/2
 * Time: 18:37
 */

namespace app\common\service;

class BaseService
{
    /**
     * 错误码列表
     * 小于0表示逻辑错误（服务端问题）   Logic
     * 大于0表示业务错误（如参数错误）   Business
     * 10xx 表示用户相关错误
     * 900x 表示接口返回错误
     */
    private static $errorCodeList = array(
        -9002		=>	'接口请求异常',
        -9001		=>	'解析数据包体异常',
        -1002		=>	'登录错误，token获取失败',
        -1001		=>	'登录错误，请联系管理员',
        -3		=>	'系统错误，您的IP被禁止访问',
        -2		=>	'系统错误，请联系管理员',
        -1		=>	'未知错误',
        0		=>	'SUCCESS',
        1		=>	'方法参数错误',
        2		=>	'请求异常',
        3		=>	'未找到地址',
        1000	=>	'token不能为空',
        1001	=>	'token失效或超时，请重新登录',
        1002	=>	'获取token失败',
        1003	=>	'登录失败，账号或者密码错误',
        1004	=>	'获取账号信息失败',
        1011	=>	'会员信息无效，请重新登陆',
        1012	=>	'未设置收货地址',
        1013	=>	'此手机号已与其他帐号绑定<br>如果继续将会解绑之前帐号<br>确定继续吗？',
        # 其他...
    );



    /**
     * 成功返回
     * @param string $msg
     * @param array $data
     */
    protected function retSuccess($msg = '',$data = []){
        return $this->output($data, $msg);
    }

    /**
     * 错误返回
     * @param string $msg
     * @param int $code 错误代码，自动编号
     * @param array $data 错误数据，用于写日志
     */
    protected function retError($code = 1,$msg = '',$data = []){

        $fanhui = $this->output($code, $msg);

        // 小于 0 的错误需要写日志
        if($code < 0){
            // 写入日志
            \think\facade\Log::warning('错误：'. $fanhui['msg'] . ' ' . json_encode($data,256));
        }

        return $fanhui;
    }

    /**
     * public static function output 输出json格式数据
     * @access public
     * @param $errorCode int | array 当输入为int类型值时，表示错误码；
     *                               当输入为array类型时，表示为正常输出数据
     *                               $errorCode < 0 表示逻辑错误（服务端问题），$errorCode > 0 表示业务错误（客户端问题，如参数错误）
     * @param $errorMessage string   当errorCode为数值时，errorMessage表示错误描述；
     *                               当errorCode不为数值时，errorMessage表示分页信息
     * @return
     *
     *      Array
    (
    [code] => 0						#错误码
    [message] => SUCCESS			#错误信息
    [data] => Array 				#接口数据
    (
    )
    [pagination] => Array 			#分页信息
    (
    [total_record] => 10	#总数据记录数
    [page] => 2				#当前页数
    [pagesize] => 8			#分页大小
    [count] => 2			#当前页数据总数
    [page_count] => 1       #总页数
    [more] => 0				#是否还有数据，1为还有数据，0表示全部数据已加载完
    )
    )
     * @api 调用示例
     *
     *       ApiHelper::output(101, '密码错误');    //输出错误信息
     *       ApiHelper::output('密码错误');         //输出错误信息
     *       ApiHelper::output(101);                //输出错误信息
     *       ApiHelper::output(array());            //输出数据（空数组）
     *       ApiHelper::output(array('abc'));       //输出数据
     *       ApiHelper::output(array('abc'), array('total_record'=>20,...));  //输出数据（有分页信息）
     */
    private function output($errorCode = 0, $errorMessage = ''){
        $return = array();
        if(is_numeric($errorCode)){
            //错误
            $errorMessage = trim($errorMessage) ? $errorMessage : (isset(self::$errorCodeList[$errorCode]) ? self::$errorCodeList[$errorCode] : $errorCode); //没有传入错误描述时输出错误码
            $errorCode = intval($errorCode);
            $return['err_code'] = $errorCode;
            if($errorCode === 0){
                $errorCode = -1;
            }
            $return['msg'] = $errorMessage;
            $return['data'] = array();
        }elseif(is_array($errorCode)){
            //正确数据
            $return['err_code'] = 0;
            $return['msg'] = "SUCCESS";
            $return['data'] = $errorCode;
            //分页信息
            if(is_array($errorMessage)){
                $return['pagination'] = $errorMessage;
            }
        }elseif(is_string($errorCode)){
            //没有输入错误码，只输入错误信息
            $return['err_code'] = 0;
            $return['msg'] = $errorCode;
            $return['data'] = array();
        }else{
            $errorCode = intval($errorCode);
            return $this->output($errorCode, $errorMessage);
        }
        // 以数组形式返回
        return $return;
    }

    protected function _getHasMorePage($totalRows,$pageIndex,$pageSize){
        $totalPage = ceil($totalRows / $pageSize);
        return $totalPage > $pageIndex;
    }
}